package com.apa7.keepaccounts.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.apa7.keepaccounts.dao.UserDao;
import com.apa7.keepaccounts.entity.PayMode;
import com.apa7.keepaccounts.entity.PayType;
import com.apa7.keepaccounts.entity.User;
import com.apa7.keepaccounts.service.UserService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class UserImpl implements UserService {

    @Autowired
    private UserDao userDao;
    private static Logger logger = LoggerFactory.getLogger(UserImpl.class);

    /**
     * 获取个人信息
     *
     * @param key 用户的key值
     * @return user的实体类
     */
    @Override
    public User getInfo(String key) {
        QueryWrapper<User> qw=new QueryWrapper<>();
        qw.lambda().eq(User::getLoginKey,key);
        return userDao.selectOne(qw);
    }

    /**
     * 设置支出类型类型置顶
     *
     * @param key          用户的key
     * @param payTypeIndex 要置顶的索引
     * @return 置顶以后的PayType
     */
    @Override
    public List<PayType> payTypeTop(String key, int payTypeIndex) {
        User user=getInfo(key);

        if(user==null){
            logger.info("用户可以值查找失败!key="+key);
            return null;
        }

        //获取支出类型
        List<PayType> payTypes = JSONArray.parseArray(user.getPayType(),PayType.class);
        if(payTypeIndex<0||payTypes.size()<=payTypeIndex){
            logger.info("索引为负值或者越界！index="+payTypeIndex);
            return null;
        }
        PayType payType=payTypes.get(payTypeIndex);
        payTypes.remove(payTypeIndex);
        payTypes.add(0,payType);

        //更新该用户的信息
        User userUpdateInfo=new User();
        userUpdateInfo.setUserId(user.getUserId());
        userUpdateInfo.setPayType(JSON.toJSONString(payTypes));
        userDao.updateById(userUpdateInfo);

        return payTypes;
    }

    /**
     * 设置支付方式置顶
     *
     * @param key          用户的key
     * @param payModeIndex 要置顶的索引
     * @return 置顶以后的PayMode
     */
    @Override
    public List<PayMode> payModeTop(String key, int payModeIndex) {
        User user=getInfo(key);

        if(user==null){
            logger.info("用户可以值查找失败!key="+key);
            return null;
        }

        //获取支出类型
        List<PayMode> payModes = JSONArray.parseArray(user.getPayMode(),PayMode.class);
        if(payModeIndex<0||payModes.size()<=payModeIndex){
            logger.info("索引为负值或者越界！index="+payModeIndex);
            return null;
        }
        PayMode payMode=payModes.get(payModeIndex);
        payModes.remove(payModeIndex);
        payModes.add(0,payMode);

        //更新该用户的信息
        User userUpdateInfo=new User();
        userUpdateInfo.setUserId(user.getUserId());
        userUpdateInfo.setPayMode(JSON.toJSONString(payModes));
        userDao.updateById(userUpdateInfo);

        return payModes;
    }

    /**
     * 添加一个支出类型
     *
     * @param key     用户的key
     * @param payType 添加的信息
     * @return 添加以后的PayType
     */
    @Override
    public List<PayType> payTypeAdd(String key, PayType payType) {
        //判断参数
        if(payType==null||payType.getTypeName().equals("")){
            return null;
        }

        //获取类型
        User user=getInfo(key);
        List<PayType> payTypes=JSON.parseArray(user.getPayType(),PayType.class);
        if(payTypes==null){
            payTypes=new ArrayList<>();
        }

        //添加进去并更新用户
        payTypes.add(payType);
        User userUpdateInfo=new User();
        userUpdateInfo.setUserId(user.getUserId());
        userUpdateInfo.setPayType(JSON.toJSONString(payTypes));
        userDao.updateById(userUpdateInfo);

        return payTypes;
    }

    /**
     * 添加一个支付方式
     *
     * @param key     用户的key
     * @param payMode 添加以后的PayMode
     * @return returnData
     */
    @Override
    public List<PayMode> payModeAdd(String key, PayMode payMode) {
        //判断参数
        if(payMode==null||payMode.getModeName().equals("")){
            return null;
        }

        //获取类型
        User user=getInfo(key);
        List<PayMode> payModes=JSON.parseArray(user.getPayMode(),PayMode.class);
        if(payModes==null){
            payModes=new ArrayList<>();
        }

        //添加进去并更新用户
        payModes.add(payMode);
        User userUpdateInfo=new User();
        userUpdateInfo.setUserId(user.getUserId());
        userUpdateInfo.setPayMode(JSON.toJSONString(payModes));
        userDao.updateById(userUpdateInfo);

        return payModes;
    }

    /**
     * 删除一个支出类型
     *
     * @param key          用户的key
     * @param payTypeIndex 支出的索引
     * @return 删除以后的PayType
     */
    @Override
    public List<PayType> payTypeDelete(String key, int payTypeIndex) {
        //获取类型列表
        User user=getInfo(key);
        if(user==null){
            logger.info("用户可以值查找失败!key="+key);
            return null;
        }
        List<PayType> payTypes=JSON.parseArray(user.getPayType(),PayType.class);

        //判断索引是否越界
        if(payTypeIndex<0||payTypes.size()<=payTypeIndex){
            logger.info("索引为负值或者越界！index="+payTypeIndex);
            return null;
        }

        //删除
        payTypes.remove(payTypeIndex);

        //更新
        User userUpdateInfo=new User();
        userUpdateInfo.setUserId(user.getUserId());
        userUpdateInfo.setPayType(JSON.toJSONString(payTypes));
        userDao.updateById(userUpdateInfo);

        return payTypes;
    }

    /**
     * 删除一个支付方式
     *
     * @param key          用户的key
     * @param payModeIndex 支出方式的索引
     * @return 删除以后的PayMode
     */
    @Override
    public List<PayMode> payModeDelete(String key, int payModeIndex) {
        //获取类型列表
        User user=getInfo(key);
        if(user==null){
            logger.info("用户可以值查找失败!key="+key);
            return null;
        }
        List<PayMode> payModes=JSON.parseArray(user.getPayMode(),PayMode.class);

        //判断索引是否越界
        if(payModeIndex<0||payModes.size()<=payModeIndex){
            logger.info("索引为负值或者越界！index="+payModeIndex);
            return null;
        }

        //删除
        payModes.remove(payModeIndex);

        //更新
        User userUpdateInfo=new User();
        userUpdateInfo.setUserId(user.getUserId());
        userUpdateInfo.setPayMode(JSON.toJSONString(payModes));
        userDao.updateById(userUpdateInfo);

        return payModes;
    }

}
